package world.snowcrystal.service;

import com.aliyun.oss.OSSException;
import world.snowcrystal.dao.UserDisplayDetails;
import world.snowcrystal.exception.SnowcrystalAlreadyExistException;
import world.snowcrystal.exception.SnowcrystalOperationFailedException;
import world.snowcrystal.exception.SnowcrystalUserNotFoundException;

import java.io.InputStream;


public interface UserService {

    // TODO 这个函数很可能在 uploadAvatar 之后调用
    //  如果 uploadAvatar 调用成功但是这个函数调用出现异常
    //  那么此时就需要对 uploadAvatar 的操作进行回顾
    //  我们需要保证这两个步骤的原子性 目前不需要考虑这回事

    /**
     * 用于更新用户的展示信息
     *
     * @param userDisplayDetails {@link UserDisplayDetails}
     * @author Tianqing
     * @since 1.0
     */
    void uploadDisplayInfo(UserDisplayDetails userDisplayDetails);

    /**
     * 将头像上传到资源服务器，并返回这个头像文件 MD5 哈希值的 Base64 编码；该哈希值将作为文件名用于定位该文件
     *
     * @param avatarFile 文件输入流
     * @param mimeType   文件的MIME 类型，比如 <code>image/jpeg</code>
     * @return Base64  representation of  MD5 hash
     */
    String uploadAvatar(InputStream avatarFile, String mimeType) throws OSSException;

    UserDisplayDetails retrieveDisplayInfo(Integer id) throws SnowcrystalUserNotFoundException;

    UserDisplayDetails retrieveUserDisplayInfo(String username) throws SnowcrystalUserNotFoundException;


    /**
     * 检查这个邮箱是否已经存在
     * @param mail 待检测邮箱
     * @return true 如果邮箱不存在于数据库中
     * @since  1.0
     * @author tianqing
     */
    boolean checkIfMailAbsent(String mail);


    /**
     * 更新用户名，如果操作失败，即受影响的行数不为 1
     * 应抛出异常并进行事务回滚
     * 如果用户名已经存在，则抛出 {@link SnowcrystalAlreadyExistException} 异常
     * @since 1.0
     * @author tianqing
     *
     */
    void updateUsername(Long id , String username)
            throws SnowcrystalOperationFailedException, SnowcrystalAlreadyExistException;

}
